package com.simpou.tests.rest;

import com.simpou.commons.utils.lang.Conditionals;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.ClientFilter;

import java.io.IOException;

/**
 * Cliente REST standalone para realização de testes sobre os serviços já
 * existentes em um servidor.
 *
 * @author Jonas Pereira
 * @since 2013-08-29
 */
public class RestClientTester {

    /**
     * URL base dos serviços.
     */
    final String baseUrl;
    /**
     * Cliente.
     */
    private final Client client;

    /**
     * Configura e inicializa um servidor REST e um cliente para se conectar a
     * ele localmente.
     *
     * @param ip IP do servidor rest.
     * @param port Porta de escuta do servidor.
     * @throws java.io.IOException if any.
     */
    public RestClientTester(final String ip, final int port, final String basePath, final Client customClient, boolean secure) throws IOException {
        final String preffix;
        if (secure) {
            preffix = "https";
        } else {
            preffix = "http";
        }
        if (Conditionals.isEmpty(basePath)) {
            this.baseUrl = preffix + "://" + ip + ":" + port + "/";
        } else {
            this.baseUrl = preffix + "://" + ip + ":" + port + "/" + basePath + "/";
        }
        this.client = customClient;
    }

    public void addFilter(final ClientFilter filter){
        this.client.addFilter(filter);
    }

    /**
     * Configura e inicializa um servidor REST e um cliente para se conectar a
     * ele localmente.
     *
     * @param ip IP do servidor rest.
     * @param port Porta de escuta do servidor.
     * @throws java.io.IOException if any.
     */
    public RestClientTester(final String ip, final int port, final String basePath)
            throws IOException {
        this(ip, port, basePath, false);
    }

    public RestClientTester(final String ip, final int port, final String basePath, boolean secure)
            throws IOException {
        this(ip, port, basePath, Client.create(), secure);
    }

    /**
     * <p>getResource.</p>
     *
     * @param relPath Caminho do recurso.
     * @return Objeto associado ao recurso solicitado.
     */
    public WebResource getResource(final String relPath) {
        final String path;
        if(relPath.startsWith("/")){
            path = relPath.substring(1);
        }else{
            path = relPath;
        }
        return client.resource(this.baseUrl + path);
    }

    /**
     * @return Url base do rest.
     */
    public String getBaseUrl() {
        return baseUrl;
    }
}
